home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / ibus-table / engine / main.py < prev    next >
Text File  |  2009-07-30  |  8KB  |  231 lines

  1. # vim:set et sts=4 sw=4
  2. #
  3. # ibus-table - The Tables engine for IBus
  4. #
  5. # Copyright (c) 2008-2009 Yu Yuwei <acevery@gmail.com>
  6. #
  7. # This library is free software; you can redistribute it and/or
  8. # modify it under the terms of the GNU Lesser General Public
  9. # License as published by the Free Software Foundation; either
  10. # version 2.1 of the License, or (at your option) any later version.
  11. #
  12. # This library is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. # Lesser General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU Lesser General Public
  18. # License along with this library; if not, write to the Free Software
  19. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  20. #
  21.  
  22. import os
  23. import sys
  24. import optparse
  25. import ibus
  26. import gobject
  27. import re
  28. patt = re.compile (r'<\?.*\?>\n')
  29. from signal import signal, SIGTERM, SIGINT
  30.  
  31. import factory
  32. import tabsqlitedb
  33.  
  34.  
  35. try:
  36.     db_dir = os.path.join (os.getenv('IBUS_TABLE_LOCATION'),'tables')
  37.     icon_dir = os.path.join (os.getenv('IBUS_TABLE_LOCATION'),'icons')
  38. except:
  39.     db_dir = "/usr/share/ibus-table/tables"
  40.     icon_dir = "/usr/share/ibus-table/icons"
  41.  
  42.  
  43. opt = optparse.OptionParser()
  44.  
  45. opt.set_usage ('%prog --table a_table.db')
  46. opt.add_option('--table', '-t',
  47.         action = 'store',type = 'string',dest = 'db',default = '',
  48.         help = 'Set the IME table file, default: %default')
  49. opt.add_option('--daemon','-d',
  50.         action = 'store_true',dest = 'daemon',default=False,
  51.         help = 'Run as daemon, default: %default')
  52. opt.add_option('--ibus', '-i',
  53.         action = 'store_true',dest = 'ibus',default = False,
  54.         help = 'Set the IME icon file, default: %default')
  55. opt.add_option('--xml', '-x',
  56.         action = 'store_true',dest = 'xml',default = False,
  57.         help = 'output the engines xml part, default: %default')
  58.  
  59. opt.add_option('--no-debug', '-n',
  60.         action = 'store_false',dest = 'debug',default = True,
  61.         help = 'redirect stdout and stderr to ~/.ibus/tables/debug.log, default: %default')
  62.  
  63. (options, args) = opt.parse_args()
  64. #if not options.db:
  65. #    opt.error('no db found!')
  66.  
  67. if (not options.xml) and options.debug:
  68.     if not os.access ( os.path.expanduser('~/.ibus/tables'), os.F_OK):
  69.         os.system ('mkdir -p ~/.ibus/tables')
  70.     logfile = os.path.expanduser('~/.ibus/tables/debug.log')
  71.     sys.stdout = open (logfile,'a',0)
  72.     sys.stderr = open (logfile,'a',0)
  73.     from time import strftime
  74.     print '--- ', strftime('%Y-%m-%d: %H:%M:%S'), ' ---'
  75.  
  76.  
  77.  
  78. class IMApp:
  79.     def __init__(self, dbfile, exec_by_ibus):
  80.         self.__mainloop = gobject.MainLoop()
  81.         self.__bus = ibus.Bus()
  82.         self.__bus.connect("disconnected", self.__bus_destroy_cb)
  83.         self.__factory = factory.EngineFactory(self.__bus, dbfile)
  84.         if exec_by_ibus:
  85.             self.__bus.request_name("org.freedesktop.IBus.Table", 0)
  86.         else:
  87.             self.__component = ibus.Component("org.freedesktop.IBus.Table",
  88.                                               "Table Component",
  89.                                               "0.1.0",
  90.                                               "GPL",
  91.                                               "Yuwei Yu <acevery@gmail.com>")
  92.             # now we get IME info from self.__factory.db
  93.             name = self.__factory.db.get_ime_property ("name")
  94.             longname = name
  95.             description = self.__factory.db.get_ime_property ("description")
  96.             language = self.__factory.db.get_ime_property ("languages")
  97.             license = self.__factory.db.get_ime_property ("credit")
  98.             author = self.__factory.db.get_ime_property ("author")
  99.             icon = self.__factory.db.get_ime_property ("icon")
  100.             if icon:
  101.                 icon = os.path.join (icon_dir, icon)
  102.                 if not os.access( icon, os.F_OK):
  103.                     icon = ''
  104.             layout = self.__factory.db.get_ime_property ("layout")
  105.             
  106.             self.__component.add_engine(name,
  107.                                         longname,
  108.                                         description,
  109.                                         language,
  110.                                         license,
  111.                                         author,
  112.                                         icon,
  113.                                         layout)
  114.             self.__bus.register_component(self.__component)
  115.  
  116.  
  117.     def run(self):
  118.         self.__mainloop.run()
  119.  
  120.     def quit(self):
  121.         self.__bus_destroy_cb()
  122.  
  123.     def __bus_destroy_cb(self, bus=None):
  124.         self.__factory.do_destroy()
  125.         self.__mainloop.quit()
  126.  
  127. def cleanup (ima_ins):
  128.     print "cleanup"
  129.     ima_ins.quit()
  130.     sys.exit()
  131.  
  132. def indent(elem, level=0):
  133.     '''Use to format xml Element pretty :)'''
  134.     i = "\n" + level*"    "
  135.     if len(elem):
  136.         if not elem.text or not elem.text.strip():
  137.             elem.text = i + "    "
  138.         for e in elem:
  139.             indent(e, level+1)
  140.             if not e.tail or not e.tail.strip():
  141.                 e.tail = i + "    "
  142.         if not e.tail or not e.tail.strip():
  143.             e.tail = i
  144.     else:
  145.         if level and (not elem.tail or not elem.tail.strip()):
  146.             elem.tail = i
  147.  
  148. def main():
  149.     if options.xml:
  150.         from locale import getdefaultlocale
  151.         from xml.etree.ElementTree import Element, SubElement, tostring
  152.         # we will output the engines xml and return.
  153.         # 1. we find all dbs in db_dir and extract the infos into
  154.         #    Elements
  155.         dbs = os.listdir(db_dir)
  156.         dbs = filter (lambda x: x.endswith('.db'), dbs)
  157.         if not dbs:
  158.             return
  159.  
  160.         egs = Element('engines')
  161.         for _db in dbs:
  162.             _sq_db = tabsqlitedb.tabsqlitedb (os.path.join (db_dir, _db))
  163.             _engine = SubElement (egs,'engine')
  164.             
  165.             _name = SubElement (_engine, 'name')
  166.             _name.text = _db.replace ('.db','')
  167.             
  168.             _longname = SubElement (_engine, 'longname')
  169.             _locale = getdefaultlocale()[0].lower()
  170.             _longname.text = _sq_db.get_ime_property ( \
  171.                     '.'.join(['name',_locale]) )
  172.             if not _longname.text:
  173.                 _longname.text = _name.text
  174.             
  175.             _language = SubElement (_engine, 'language')
  176.             _langs = _sq_db.get_ime_property ('languages')
  177.             if _langs:
  178.                 _langs = _langs.split (',')
  179.                 if len (_langs) == 1:
  180.                     _language.text = _langs[0].strip()
  181.                 else:
  182.                     # we ignore the place
  183.                     _language.text = _langs[0].strip().split('_')[0]
  184.  
  185.             _license = SubElement (_engine, 'license')
  186.             _license.text = _sq_db.get_ime_property ('license')
  187.  
  188.             _author = SubElement (_engine, 'author')
  189.             _author.text  = _sq_db.get_ime_property ('author')
  190.  
  191.             _icon = SubElement (_engine, 'icon')
  192.             _icon_basename = _sq_db.get_ime_property ('icon')
  193.             if _icon_basename:
  194.                 _icon.text = os.path.join (icon_dir, _icon_basename)
  195.             
  196.             _layout = SubElement (_engine, 'layout')
  197.             _layout.text = _sq_db.get_ime_property ('layout')
  198.  
  199.             _desc = SubElement (_engine, 'description')
  200.             _desc.text = _sq_db.get_ime_property ('description')
  201.  
  202.         # now format the xmlout pretty
  203.         indent (egs)
  204.         egsout = tostring (egs, encoding='utf8')
  205.         egsout = patt.sub ('',egsout)
  206.         print egsout
  207.         
  208.         return 0
  209.  
  210.     if options.daemon :
  211.         if os.fork():
  212.                 sys.exit()
  213.     if options.db:
  214.         if os.access( options.db, os.F_OK):
  215.             db = options.db
  216.         else:
  217.             db = '%s%s%s' % (db_dir,os.path.sep, os.path.basename(options.db) )
  218.     else:
  219.         db=""
  220.     ima=IMApp(db, options.ibus)
  221.     signal (SIGTERM, lambda signum, stack_frame: cleanup(ima))
  222.     signal (SIGINT, lambda signum, stack_frame: cleanup(ima))
  223.     try:
  224.         ima.run()
  225.     except KeyboardInterrupt:
  226.         ima.quit()
  227.  
  228. if __name__ == "__main__":
  229.     main()
  230.  
  231.